<?php

/**
 * Un evenement, c'est une action effectuée durant le jeu.
 * Il est assigné a une partie, a un type d'evenement, un auteur et une "data" dont la nature dépends du type d'evenement.
 * Il y aura donc une multitude de fonction, pour chaque type d'evenement.
 *
 * @author Cyril
 */
class Evenement {

    /**
     *  Identifiant de l'evenement
     * @var int Identifiant 
     */
    private $idevenement;
    /**
     *  Type de l'evenement
     * @var string ()
     */
    private $type;
    /**
     *  N'importe quoi
     * @var mixed 
     */
    private $data;
    /**
     * 
     * @var int Nom du joueur qui aurai provoqué l'evenement 
     */
    private $destination;
    /**
     *  
     * @var SQLite_resource SQLite 
     */
    private $db;
    /**
     *  Partie auquelle est affiliée l'event
     * @var idPartie 
     */
    private $idpartie;

    /**
     *  Créée une nouvelle entrée evenement dans la DB
     * @param SQLite_resource $db
     * @param string $type
     * @param mixed $destination (String ou joueur)
     * @param Partie $partie
     * @param mixed $data 
     * @example Pour déposer une carte sur le talon (le 8 rouge) dans la partie $partie: <br>
     * Evenement::create("mouvement_carte", 5, $partie, "R81")
     */
    public static function create($type, $destination, Partie $partie, $data) {
        log_it(__METHOD__, 1);
        if (is_a($destination, "Joueur")) {
            $destination = $partie->getPositionJoueur($destination);
        }
        //$db = $partie->getDb();
        //$type = sqlite_escape_string($type);
        $destination = mysql_real_escape_string($destination);
        $data = mysql_real_escape_string($data);
        log_it("Type : '$type', dest : $destination, data : '$data', partie : " . $partie->getIdPartie(), 0);

        if (mysql_query("INSERT INTO evenement VALUES (
                NULL,
                '$type',
                '$data',
                '$destination',
                '{$partie->getIdPartie()}'
            );")) {
            $i = mysql_insert_id();
            log_it("Evenement cree : $i)", 0);
            log_it("/" . __METHOD__, -1);
            return $i;
        } else {
            log_it("Erreur : " . mysql_error() . ")", 0);
            log_it("/" . __METHOD__, -1);
            //exit();
        }
        //return new Evenement($db, $idevenement);
    }

    /**
     *  Récupère un evenement dans la DB depuis son id
     * @param SQLite_resource $db
     * @param int $id 
     */
    public function __construct($db, $id) {
        $this->db = $db;
        $this->idevenement = intval($id);
        $q = mysql_query("
            SELECT * FROM evenement WHERE idevenement=$this->idevenement");
        if ($q && $d = mysql_fetch_array($q)) {
            $this->data = $d["data"];
            $this->destination = intval($d["destination"]);
            $this->idpartie = $d["idpartie"];
            $this->type = $d["type"];
        }
    }

    /**
     *  Retourne un tableau des evenements suivant l'evenement n° $idevenement;
     * @param int $idEvenement Id du dernier evenement recut
     * @param SQLite_resource $db 
     * @return Array<Evenement> 
     */
    public function getId() {
        return $this->idevenement;
    }

    public function toArray() {
        $r = array();
        $r["action"] = $this->type;
        $r["id_evenement"] = $this->idevenement;
        switch ($this->type) {
            case "nouveau_joueur":
                $r["nom_joueur"] = $this->data;
                $r["place"] = intval($this->destination);
                break;
            case "supprimer_joueur":
                $r["nom_joueur"] = $this->data;
                $r["place"] = intval($this->destination);
                break;
            case "mouvement_carte":
                $r["id_carte"] = $this->data;
                $r["vers"] = intval($this->destination);
                $r["de"] = intval($this->getOrigin());
                break;
            case "tour_de":
                $r["de"] = intval($this->destination);
                break;
            case "choisir_couleur":
                $r["place"] = intval($this->destination);
                break;
            case "changement_couleur":
                $r["couleur"] = $this->data;
                break;
            case "partie_terminee":
                $r["gagnant"] = intval($this->destination);
                $r["nom"] = $this->data;
                break;
            case "event_uno":
                $r["nb_place"] = intval($this->destination);
                break;
            case "event_contre_uno":
                $r["cible"] = intval($this->data);
                $r["nb_place"] = intval($this->destination);
                break;
            case "event_commencer_partie":
                $r["Easter Egg"] = "Ouii !";
                break;
            case "event_chat":
                $r["message"] = $this->data;
                $r["place"] = $this->destination;
                break;
            default :
                $r["data"] = $this->data;
                $r["destination"] = $this->destination;
                $t["ERREUR"] = "Cet evenement n'a pas été traité dans la mise en tableau";
                break;
        }
        return $r;
    }

    /**
     *  Permet simplement de filtrer les evenements qui n'ont pas pour destination la position du joueur ou le talon en leur assigant une carte cachée
     *  
     * @param Array<Evenement> $array
     * @param Joueur $joueur 
     */
    public static function filter(&$array, Joueur $joueur) {
        log_it(__METHOD__, 1);
        $position = $joueur->getPosition();
        log_it("Position du joueur : $position", 0);
        foreach ($array as $key => $event) {
            if ($event["action"] == "mouvement_carte" && ($event["vers"] != $position && $event["vers"] != 5)) {
                log_it("Carte Cachée (vers : " . $event["vers"] . ")", 0);
                $array[$key]["id_carte"] = "CC";
            }
            if ($event["action"] == "choisir_couleur" && $event["place"] != $position) {
                unset($array[$key]);
            }
            if ($event["action"] == "mouvement_carte" && $event["vers"] == 4) {
                unset($array[$key]);
            }
        }
        log_it("/" . __METHOD__, -1);
    }

    public function getOrigin() {
        if ($this->type != "mouvement_carte")
            return null;
        $q = mysql_query("
            SELECT * FROM evenement
            WHERE idevenement<" . $this->idevenement . " 
                AND type='mouvement_carte'
                AND idpartie = " . $this->idpartie . "
                AND data = '" . $this->data . "'
            ORDER BY idevenement DESC LIMIT 1;
            ");
        if ($q && $d = mysql_fetch_array($q)) {
            return $d['destination'];
        } else
            return null;
    }

    public static function nettoyer($db) {
        //sqlite_query($db, "DELETE FROM evenement WHERE idpartie NOT IN (select idpartie from partie)");
    }

}

?>
